package 动态代理;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyUtil {
    //这个类的作用是创建一个代理



     /*定义一个方法给明星的对象创建一个代理
             参数:被代理的明星对象
            返回值:给明星创建的代理
         */
    public static Star createProxy(BigStar bigStar){
        /* java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法
            类加载器:把类的字节码文件加载到类当中.
         */
        Star star = (Star) Proxy.newProxyInstance(
                ProxyUtil.class.getClassLoader(), //指定类加载器,然后加载生成的代理类
                new Class[]{Star.class}, //指定接口,这些接口用于指定生成的代理能代理什么方法,
                //参数三:用于指定生成的代理要做什么事情
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        /*
                        参数一:代理的对象
                        参数二:要运行的方法sing
                        参数三:调用sing方法时要传递的实参.
                         */
                        if (method.getName().equals("sing")){
                            System.out.println("调用的sing方法,唱歌收钱");
                        }else if ("dance".equals(method.getName())){
                            System.out.println("调用的dance方法,准备场地");
                        }
                        //调用大明BigStart类中的唱歌和跳舞的方法
                        method.invoke(bigStar,args);
                        return method.invoke(bigStar,args);
                    }
                }
        );

        return star;
    }
}
